﻿package com.csd.excelreader;

/*
 * 类ExcelReader
 * 名称：	ExcelReader
 * 作用：	用以读取微软表格Excel文件中的数据
 * 特征：	以行为单位逐行读取，同时提供用以在行内读取具体单元格的方法
 * 作者：	李书杰
 * 最后修改：	2009-04-03
 */

import java.io.*;
import java.util.*;

import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.poifs.filesystem.*;

/**
 * Class ExcelReader
 * 用于封装 POI 中对 Excel 的一些需要的接口;
 * 由于都是对原有接口的封装，所以没有牵涉复杂的功能；
 * 另外需要注明的是，这里对运作的原理做了约束，
 * 要求首先载入 Excel 文件，并以行为单位载入和操作
 * @version 1.0
 * @author thirchina
 * 
 */
public class ExcelReader {
	
	/*
	 * 输入文件
	 */
	private POIFSFileSystem fileSystem = null;
	
	/*
	 * 工作书
	 */
	private HSSFWorkbook workBook = null;
	
	/*
	 * 当前层
	 */
	private HSSFSheet sheet = null;
	
	/*
	 * 当前工作的行
	 */
	private HSSFRow row = null;
	
	/*
	 * 当前的行号
	 */
	private int rowNo = 0;
	
	/*
	 * 输入文件的路径
	 */
	private String inputFilePath = null;
	
	/**
	 * 方法 getInputFile
	 * 获得当前设置的输入文件的路径
	 * @return 输入文件的路径
	 */
	public String getInputFilePath () 
	{
		return inputFilePath;
	}

	/**
	 * 方法 setInputFile
	 * 按照文件路径，载入输入的Excel文件
	 * @param 输入文件路径 String 类型
	 * @return 成功与否
	 */
	public boolean loadInputFileByPath (String new_inputFile)
	{
		FileInputStream FIS = null;
		try
		{
			FIS = new FileInputStream(new_inputFile);			
			this.fileSystem = new POIFSFileSystem(FIS);
			this.workBook = new HSSFWorkbook(this.fileSystem);
			
			this.sheet = this.workBook.getSheetAt(0);
			
			if ( sheet == null )
			{
				return false;
			}
			
			this.row = this.sheet.getRow(this.rowNo);
			
			if ( this.row == null )
			{
				return false;
			}
			
			this.inputFilePath = new_inputFile;

			return true;
		}
		catch(IOException e)
		{
			//e.printStackTrace();
			return false;
		}
	};
	
	/**
	 * 构造函数
	 */
	public ExcelReader ()
	{
		return;
	};
	
	public ExcelReader (String new_inputFile)
	{
		this.loadInputFileByPath(new_inputFile);
	};
	
	/**
	 * 方法 nextRow
	 * 作用：使得操作焦点指向下一行
	 * @return 是否成功
	 */
	public boolean nextRow ()
	{
		HSSFRow row = this.sheet.getRow( ++ this.rowNo );
		if ( row == null )
		{
			this.rowNo --;
			return false;
		}
		else
		{
			this.row = row;
			return true;
		}
	}

	/**
	 * @return the rowNo
	 */
	public int getRowNo () 
	{
		return rowNo;
	}
	
	/**
	 * 方法 setRow
	 * 将当前行焦点设置成 dstRow
	 * @param dstRow
	 * @return 是否成功
	 */
	public boolean setRow ( int dstRow )
	{
		HSSFRow row = this.sheet.getRow( dstRow );
		if ( row == null )
		{			
			return false;
		}
		else
		{
			this.rowNo = dstRow;
			this.row = row;
			return true;
		}
	}
	
	/**
	 * 方法 getCellType
	 * 获取单元格的值的类型
	 * @param index
	 * @return 单元格值类型
	 */
	public int getCellType ( int index )
	{
		HSSFCell temp_cell = this.row.getCell ( index );
		if ( temp_cell == null )
		{
			return HSSFCell.CELL_TYPE_ERROR;
		}
		return temp_cell.getCellType ();
	};
	
	/**
	 * 方法 isNumeric
	 * 判定单元格是否为数字类型
	 * @param index
	 * @return 是否是数字
	 */
	public boolean isNumeric ( int index )
	{
		return ( this.getCellType ( index ) == HSSFCell.CELL_TYPE_NUMERIC );
	};
	
	/**
	 * 方法 isString
	 * 判定单元格是否是字符串类型
	 * @param index
	 * @return 是否是字符串
	 */
	public boolean isString ( int index )
	{
		return ( this.getCellType ( index ) == HSSFCell.CELL_TYPE_STRING );
	};
	
	/**
	 * 方法 isFormula
	 * 判定单元格是否是表达式
	 * @param index
	 * @return 是否是表达式
	 */
	public boolean isFormula ( int index )
	{
		return ( this.getCellType ( index ) == HSSFCell.CELL_TYPE_FORMULA );
	};
	
	/**
	 * 方法 isBoolean
	 * 判定单元格是否是布尔值
	 * @param index
	 * @return 是否是布尔值
	 */
	public boolean isBoolean ( int index )
	{
		return ( this.getCellType ( index ) == HSSFCell.CELL_TYPE_BOOLEAN );
	};
	
	/**
	 * 方法 isBlank
	 * 判定是否是空白
	 * @param index
	 * @return 是否是空白
	 */
	public boolean isBlank ( int index )
	{
		return ( this.getCellType ( index ) == HSSFCell.CELL_TYPE_BLANK );
	};
	
	/**
	 * 方法 isErr
	 * 检查是否会发生错误
	 * 通常是因为该单元格不存在实际数据导致
	 * @param index
	 * @return 是否发生错误
	 */
	public boolean isErr ( int index )
	{
		return ( this.getCellType ( index ) == HSSFCell.CELL_TYPE_ERROR );
	};
	
	/**
	 * 方法 getCell
	 * 返回单元格
	 * @param index
	 * @return 单元格
	 */
	public HSSFCell getCell ( int index )
	{
		HSSFCell temp_cell = this.row.getCell ( index );
		if ( temp_cell == null )
		{
			return null;
		}

		return temp_cell; 
	}
	
	/**
	 * 方法 getCellStringValue
	 * 获取指定单元格的字符串值
	 * @param index
	 * @return 指定单元格的字符串值
	 */
	public String getCellStringValue ( int index )
	{
		HSSFCell temp_cell = this.row.getCell ( index );
		String temp_String = null;
		if ( temp_cell == null )
		{
			return null;
		}
		try{
			temp_String = temp_cell.getStringCellValue();
		}
		catch ( Exception e )
		{
			e.printStackTrace();
		}
		return temp_String; 
	};
	
	/**
	 * 方法 getCellRichStringValue
	 * 获取指定单元格的强字符串值
	 * @param index
	 * @return 指定单元格的强字符串值
	 */
	public HSSFRichTextString getCellRichStringValue ( int index )
	{
		HSSFCell temp_cell = this.row.getCell ( index );
		HSSFRichTextString temp_String = null;
		if ( temp_cell == null )
		{
			return null;
		}
		try{
			temp_String = temp_cell.getRichStringCellValue ();
		}
		catch ( Exception e )
		{
			e.printStackTrace();
		}
		return temp_String; 
	};
	
	/**
	 * 方法 getCellNumericValue
	 * 获取指定单元格的数字值
	 * @param index
	 * @return 指定单元格的数字值
	 */
	public double getCellNumericValue ( int index )
	{
		HSSFCell temp_cell = this.row.getCell ( index );
		double temp_Num = 0.0;
		if ( temp_cell == null )
		{
			return temp_Num;
		}
		try{
			temp_Num = temp_cell.getNumericCellValue ();
		}
		catch ( Exception e )
		{
			e.printStackTrace();
		}
		return temp_Num; 
	};
	
	/**
	 * 方法 getCellDateValue
	 * 获取指定单元格的时间日期值
	 * @param index
	 * @return 指定单元格的时间日期值
	 */
	public Date getCellDateValue ( int index )
	{
		HSSFCell temp_cell = this.row.getCell ( index );
		Date temp_date = null;
		if ( temp_cell == null )
		{
			return temp_date;
		}
		try{
			temp_date = temp_cell.getDateCellValue ();
		}
		catch ( Exception e )
		{
			return null;
		}
		return temp_date; 
	};
	
	/**
	 * 方法 getCellFormulaValue
	 * 获取指定单元格的表达式字符串
	 * @param index
	 * @return 指定单元格的表达式字符串
	 */
	public String getCellFormulaValue ( int index )
	{
		HSSFCell temp_cell = this.row.getCell ( index );
		String temp_String = null;
		if ( temp_cell == null )
		{
			return null;
		}
		try{
			temp_String = temp_cell.getCellFormula ();
		}
		catch ( Exception e )
		{
			e.printStackTrace();
		}
		return temp_String; 
	};
	
	/**
	 * 方法 getCellBooleanValue
	 * 获得指定单元格的布尔值
	 * @param index
	 * @return 指定单元格的布尔值
	 */
	public boolean getCellBooleanValue ( int index )
	{
		HSSFCell temp_cell = this.row.getCell ( index );
		boolean temp_bool = true;
		if ( temp_cell == null )
		{
			return temp_bool;
		}
		try{
			temp_bool = temp_cell.getBooleanCellValue ();
		}
		catch ( Exception e )
		{
			e.printStackTrace();
		}
		return temp_bool; 
	}

}
